package com.ycd.service.impl;

import com.ycd.domain.MovieTicket;
import com.ycd.dto.UserMovieDto;
import com.ycd.mapper.MovieTicketMapper;
import com.ycd.result.JsonResult;
import com.ycd.service.IMovieTicketService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author director
 * @since 2022-09-01
 */
@Service
public class MovieTicketServiceImpl extends ServiceImpl<MovieTicketMapper, MovieTicket> implements IMovieTicketService {

    @Autowired
    private MovieTicketMapper movieTicketMapper;

    /**
     * 买电影票业务
     * 电影票购买根据Id进行购买，购买前判断库存是否足够，如果不足响应提示，购买需要保存用户、电影票中间表，以及是否使用状态
     * 根据Id购买电影票，扣减用户余额、在电影服务中新增用户与电影票数据，用户可写死
     * @param userId
     * @param movieId
     * @return
     */
    @Override
    public JsonResult buyTicket(Long userId, Long movieId) {
        MovieTicket movieTicket = movieTicketMapper.selectById(movieId);
        Long stock = movieTicket.getStock();
        if (stock == 0){
            return JsonResult.error("库存不够了，加库存","1001");
        }
        // 查询中间表
        UserMovieDto userMovieDto = movieTicketMapper.queryUserMovieById(userId,movieId);
        if (userMovieDto == null){
            // 如果中间表没有数据，说明用户没有买过电影票，就新增数据
            UserMovieDto userMovieDto1 = new UserMovieDto(userId, movieId, 1);
            movieTicketMapper.saveUserMovie(userMovieDto1);
        }else {
            // 如果中间表有数据，说明用户买过电影票，就修改数据
            userMovieDto.setCount(userMovieDto.getCount() + 1);
            movieTicketMapper.updateUserMovie(userMovieDto);
        }
        // 扣减库存
        movieTicket.setStock(movieTicket.getStock()-1);
        // 更新数据库
        updateById(movieTicket);

        return JsonResult.success(movieTicket.getPrice());
    }

    /**
     * 观看电影业务
     * 根据电影Id，查询用户是否拥有此电影票，电影票是否过期，过期提示不可观看
     * @param userId
     * @param movieId
     * @return
     */
    @Override
    public JsonResult watchMovie(Long userId, Long movieId) {
        // 根据id查询用户要观看的电影票
        MovieTicket movieTicket = movieTicketMapper.selectById(movieId);
        // 电影结束时间小于当前时间
        if (movieTicket.getEndTime().getTime() < new Date().getTime()){
            return JsonResult.error("电影已结束","1002");
        }
        // 查询中间表
        UserMovieDto userMovieDto = movieTicketMapper.queryUserMovieById(userId,movieId);
        // 如果没有电影票
        if (userMovieDto == null){ // 如果中间表数据为空
            return JsonResult.error("要购买电影票","1003");
        }else if (userMovieDto.getCount() < 1){ // 如果中间票数据count小于1
            return JsonResult.error("要购买电影票！","1004");
        }
        // 如果有电影票，说明用户购买过电影票，
        userMovieDto.setCount(userMovieDto.getCount() - 1);
        movieTicketMapper.updateUserMovie(userMovieDto);

        return JsonResult.success("可以观看电影！", "ok");
    }
}
